package br.com.sbc.ejb.entity;

import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@NamedQueries({
	@NamedQuery (name = "Postagem.postagensPorAssunto", query = " Select p from Postagem p where p.idPostagem in (select p from p.assuntos pa where pa.idAssunto =:idAssunto)"),
	@NamedQuery (name = "Postagem.consultarTodasPostagens", query = "Select p from Postagem p"),
	@NamedQuery (name = "Postagem.postagensPorUsuario", query = "Select p from Postagem p where p.usuario.idUsuario = :idUsuario"),
	@NamedQuery (name = "Postagem.postagensPorTitulo",query="select  p from Postagem p where upper(p.titulo) like :digitado or upper(p.titulo) like :digitado2 or upper(p.mensagem) like :digitado3"),
	@NamedQuery (name = "Postagem.postagensPorMensagem",query="select p from Postagem p where upper(p.mensagem) like :digitado or upper(p.mensagem) like :digitado2 or upper(p.mensagem) like :digitado3"),
	@NamedQuery (name = "Postagem.consultaPostagemPorId", query = "Select p from Postagem p where p.idPostagem = :idPostagem"),
	@NamedQuery (name = "Postagem.postagensRecentes", query = "Select p from Postagem p order by p.dataPostagem desc"),
	@NamedQuery (name = "Postagem.contadorAssunto", query = "Select count(p.idPostagem) from Postagem p where p.idPostagem in (select p from p.assuntos pa where pa.idAssunto =:idAssunto)"),
	@NamedQuery (name = "Postagem.postagemPorViews", query = "Select p from Postagem p order by p.views desc"),
	@NamedQuery (name = "Postagem.postagemPorVoto", query = "Select v.postagem.idPostagem from Voto v group by v.postagem.idPostagem order BY sum(v.positivo) desc"),
	
})

public class Postagem {
	
	@Id @GeneratedValue
	@Column(name="ID_POSTAGEM")
	private Long idPostagem;
	
	private String titulo;
	@Column(length=8000)
	private String mensagem;
	
	@Column
	private Long views;
	
	@OneToMany(mappedBy = "postagem")
	private List<Voto> votos;
	
	@Column(name="DATA_POSTAGEM")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataPostagem;
	
	@ManyToMany(fetch = FetchType.EAGER)
	private List<Assunto> assuntos;
	
	@ManyToOne(fetch = FetchType.EAGER)
	private Usuario usuario;
	
//**************************GETTERS AND SETTERS ************************************************
	
	public Long getIdPostagem() {
		return idPostagem;
	}

	public void setIdPostagem(Long idPostagem) {
		this.idPostagem = idPostagem;
	}

	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	public String getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}

	public Date getDataPostagem() {
		return dataPostagem;
	}

	public void setDataPostagem(Date dataPostagem) {
		this.dataPostagem = dataPostagem;
	}

	public List<Assunto> getAssuntos() {
		return assuntos;
	}

	public void setAssuntos(List<Assunto> assuntos) {
		this.assuntos = assuntos;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Long getViews() {
		return views;
	}

	public void setViews(Long views) {
		this.views = views;
	}
	public List<Voto> getVotos() {
		return votos;
	}

	public void setVotos(List<Voto> votos) {
		this.votos = votos;
	}
/*------------------ Hash Code ------------*/
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((idPostagem == null) ? 0 : idPostagem.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Postagem other = (Postagem) obj;
		if (idPostagem == null) {
			if (other.idPostagem != null)
				return false;
		} else if (!idPostagem.equals(other.idPostagem))
			return false;
		return true;
	}

}